<?php

/**
 * class Controller
 * класс-родитель для всех контроллеров страниц
 */
class Controller {
    protected $model;
    protected $view;
    public $registry;
  
    /**
     * Выполняет указанное действие из параметра $action
     * 
     * @param Action $action
     * @param type $dir
     * @param type $args
     * @return type 
     */
    protected function doAction($action) {
        $class = $action->getClass();
        $method = $action->getMethod();
        $args = $action->getArgs();

            $controller = new $class();

            $isModule = ($controller instanceof AbstractModule);
            $isComponent =  ($controller instanceof AbstractComponent);
            
            if ($isModule) {
                //создаём маскированный путь
                $path_mask = $method;
                for ($i = 0; $i < count($args); $i++) {
                    if (is_numeric($args[$i]))
                        $path_mask.='/%num%';
                    else
                        $path_mask.='/%text%';
                }
            }
                
            if (is_callable(array($controller, $method))) {
                if ((!$isModule && !$isComponent) || (($isModule) && $controller->isAllowedPath(strtolower($path_mask)))) {
                    $exit_code = call_user_func_array(array($controller, $method), $args);
                    return array($exit_code, $controller);
                }
                elseif($isComponent){    
                    $controller->setRegion($args['region']);
                    call_user_func_array(array($controller, $method), $args);
                    return 0;
                }
            } else {
                return ($isModule?array(404, $controller):0);
            }
            return 0;
    }

    /**
     * Заполняет регионы шаблона из массива $pagedata
     * @param type $pagedata 
     * $pagedata['data'] - должен содержать html 
     * $pagedata['region'] - в какой регион выводить 
     */
    protected function output($pagedata) {
        foreach ($pagedata as $value) {
            ob_start();
            echo $value['data'];
            $output = ob_get_contents();
            ob_end_clean();
            $this->pageunit->{'add'.$value['region']}($output);
        }
    }
    /**
     * Заменят в пути все числовые аргументы на %
     * Достаёт из строки все аргументы и помещет их в массив
     * @param type $path
     * @param type $args 
     */
    protected static function preparePath(&$path, &$args) {
        $args = array();
        $args = explode('/', $path);
        array_shift($args);
        array_shift($args);
        
        $path = preg_replace('/([0-9]+)/ui', '%', $path);
    }
    
    public function __get($key) {
        return $this->registry->get($key);
    }

    public function __set($key, $value) {
        $this->registry->set($key, $value);
    }

    public function __construct() {
        $this->registry = Registry::getInstance();

    }




}
?>
